# -*- coding=utf-8 -*-
# 动态画出sin(x)/x函数曲线
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# delta，防止分母为0
delta = 1e-5
# 设置横轴范围[-max_x, max_x]
max_x = 200
# 横轴采样个数，0~200 一共采样800个点，采样个数越多，动画越慢
points_num = 800
# 生成子图，相当于fig = plt.figure(),ax = fig.add_subplot(),其中ax的函数参数表示把当前画布进行分割，
fig, ax = plt.subplots()
# xdata保存横坐标，ydata保存sin(x)/x
xdata, ydata = [], []
ln, = ax.plot([], [], 'r-', animated=False)
# 给背景添加网格线
plt.grid(ls="--")

# 函数功能： 设置横轴和纵轴坐标范围
def init():
    # 清空数据
    del xdata[:]
    del ydata[:]
    ax.set_xlim(-max_x, max_x)
    ax.set_ylim(-0.5, 1.5)
    # 返回曲线
    return ln,

# 函数功能：
def update(x):
    if 0.0 == x:
        x += delta
    # 将每次传过来的n追加到xdata中
    xdata.append(x)
    # 负半轴对应坐标保存到xdata
    xdata.insert(0, -x)
    # ydata.append(np.sin(frame))
    ydata.append(np.sin(x) / x)
    ydata.insert(0, np.sin(-x) / (-x))
    # 重新设置曲线的值
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig=fig, func=update, 
                    frames=np.linspace(0, max_x, points_num),   # 生成所有的x坐标
                    init_func=init,
                    repeat=False,   # 是否重复跑
                    interval=5,     # 每帧动画间隔时间 ms
                    blit=True,
                    )

plt.show()
# exit(0)
# ani.save('sin_test1.gif', writer='MovieWriter', fps=60)
